/**
 * weebox.js
 * @category   javascript
 * @package    jquery
 * @author     Jack <xiejinci@gmail.com>
 * @version
 */
(function($) {
    var cachedata = {};
    var arrweebox = new Array();
    var weebox = function(content,options) {
        var self        = this;
        this.dh         = null;
        this.mh         = null;
        this.dc         = null;
        this.dt         = null;
        this.db         = null;
        this.selector   = null;
        this.ajaxurl    = null;
        this.options    = null;
        this._dragging  = false;
        this._content   = content || '';
        this._options   = options || {};
        this._defaults  = {
            boxid: null,
            boxclass: null,
            cache: false,
            type: 'dialog',
			titleclass: '',
            title: '',
            width: 0,
            height: 0,
            timeout: 0,
            draggable: true,
            modal: true,
            focus: null,
            blur: null,
            position: 'center',
            overlay: 30,
            showTitle: true,
            showButton: true,
            showCancel: true,
            showOk: true,
            okBtnName: '确定',
            cancelBtnName: '取消',
            contentType: 'text',
            contentChange: false,
            clickClose: false,
            zIndex: 9999,
            animate: '',
            showAnimate:'',
            hideAnimate:'',
            onclose: null,
            onopen: null,
            oncancel: null,
            onok: null,
            select:{url:'',type:'radio', tele:'',vele:'',width:120,search:false,fn:null}
        };
        //初始化选项
        this.initOptions = function() {
            self._options = self._options || {};
            self._options.animate = self._options.animate || '';
            self._options.showAnimate = self._options.showAnimate || self._options.animate;
            self._options.hideAnimate = self._options.hideAnimate || self._options.animate;
            self._options.type = self._options.type || 'dialog';
            self._options.title = self._options.title || '';
			self._options.titleclass = self._options.titleclass || '';
            self._options.boxclass = self._options.boxclass || 'wee' + self._options.type;
            self._options.contentType = self._options.contentType || "";
            if (self._options.contentType == "") {
                self._options.contentType = (self._content.substr(0,1) == '#') ? 'selector' : 'text';
            }
            self.options  = $.extend({}, self._defaults, self._options);
            self._options = null;
            self._defaults = null;
        };
        //初始化弹窗Box
        this.initBox = function() {
            var html = '';
			var titleClass = (self.options.titleclass) ? self.options.titleclass : "cor-444";
            switch (self.options.type) {
                case 'dialog':
                html =  '<div class="modal">' +
                        '    <div class="modal-header dialog-header">' +
                        '        <a data-dismiss="modal" class="close dialog-close" href="javascript:;">×</a>' +
                        '        <h3 class="dialog-title"></h3>' +
                        '    </div>' +
                        '    <div class="modal-body dialog-content">' +
                        '       <p>One fine body…</p>' +
                        '    </div>' +
                        '    <div class="modal-footer dialog-button">' +
                        '        <a class="btn btn-primary dialog-ok" href="javascript:;">确 定</a>' +
                        '        <a class="btn dialog-cancel" href="javascript:;">取 消</a>' +
                        '    </div>' +
                        '</div>';
                        break;
                case 'select':
                case 'error':
                case 'success':
                case 'warning':
                        break;
                case 'custom':
                html =  '<div><div class="dialog-content"></div></div>';
                        break;
            }
            self.dh = $(html).appendTo('body').hide().css({
                position: 'absolute',
                overflow: 'hidden',
                zIndex: self.options.zIndex
            });
            self.dc = self.find('.dialog-content');
            self.dt = self.find('.dialog-title');
            self.db = self.find('.dialog-button');
            if (self.options.boxid) {
                self.dh.attr('id', self.options.boxid);
            }
            if (self.options.boxclass) {
                self.dh.addClass(self.options.boxclass);
            }
            if (self.options.height > 0) {
                self.dc.css('height', self.options.height);
            }
            if (self.options.width > 0) {
                self.dh.css('width', self.options.width);
            }
            if (typeof $.fn.bgIframe != 'undefined') {
                self.dh.bgiframe();
            }
			if (self.options.titleclass) {
				self.dt.addClass(titleClass);
			}
        }
        //初始化遮照
        this.initMask = function() {
            if (self.options.modal) {
                if ($.browser.msie) {
                    h = document.compatMode == "CSS1Compat" ? document.documentElement.clientHeight : document.body.clientHeight;
                    w = document.compatMode == "CSS1Compat" ? document.documentElement.clientWidth : document.body.clientWidth;
                } else {
                    h = self.bheight();
                    w = self.bwidth();
                }
                self.mh = $("<div class='dialog-mask'></div>")
                .appendTo('body').hide().css({
                    width: w,
                    height: h,
                    zIndex: self.options.zIndex-1
                });
                //仅ie6才需要修复遮罩遮不住select框的问题 -- silver 2011.06
                if (typeof $.fn.bgIframe != 'undefined') {
                    if ($.browser.msie && ($.browser.version == "6.0") && !$.support.style) {
                        self.mh.bgiframe();
                    }
                }
            }
        }
        //初始化弹窗内容
        this.initContent = function(content) {
            self.dh.find(".dialog-ok").html(self.options.okBtnName);
            self.dh.find(".dialog-cancel").html(self.options.cancelBtnName);
            if (self.options.title == '') {
                //self.dt.hide();
                //self.dt.html(self._titles[self._options.type] || '');
            } else {
                self.dt.html(self.options.title);
            }
            if (!self.options.showTitle) {
                self.dt.hide();
            }
            if (!self.options.showButton) {
                self.dh.find('.dialog-button').hide();
            }
            if (!self.options.showCancel) {
                self.dh.find('.dialog-cancel').hide();
            }
            if (!self.options.showOk) {
                self.dh.find(".dialog-ok").hide();
            }
            if (self.options.type == 'select') {
                var type = self.options.select.type || 'radio';
                var url = self.options.select.url || self._content || '';
                var search = self.options.select.search || false;
                $.ajax({
                    type: "GET",
                      url: url,
                      success: function(data){
                        var html = '';
                        if (data === null) {
                            html = '没有数据';
                        } else {
                            if (search) {
                                html += '<div class="wsearch"><input type="text"><input type="button" value="查询"></div>';
                            }
                            var ovals = $.trim($(self.options.select.vele).val()).split(',');   // 原值
                            html += '<div class="wselect">';
                            for (key in data) {
                                var checked = ($.inArray(data[key].id, ovals)==-1)?'':'checked="checked"';
                                html += '<li><label><input name="wchoose" '+checked+' type="'+type+'" value="'+data[key].id+'">'+data[key].name+'</label></li>';
                            }
                            html += '</div>';
                        }
                        self.setContent(html);
                        self.find('li').width(self.options.select.width);
                        self.find('.wsearch input').keyup(function(){
                            var v = $.trim(this.value);
                            self.find('li').hide();
                            for (i in data) {
                                if (data[i].id == v || data[i].name.indexOf(v)!=-1) {
                                    self.find('li:eq('+i+')').show();
                                }
                            }
                        });
                        self.setOnok(function(){
                            if (type=='radio') {
                                if (self.find(':checked').length == 0) {
                                    $(self.options.select.tele).val('');
                                    $(self.options.select.vele).val('');
                                } else {
                                    var i = self.find(':radio[name=wchoose]').index(self.find(':checked')[0]);
                                    $(self.options.select.tele).val(data[i].name);
                                    $(self.options.select.vele).val(data[i].id);
                                    if (typeof self.options.select.fn == 'function') fn(data[i]);
                                }
                            } else {
                                if (self.find(':checked').length == 0) {
                                    $(self.options.select.tele).val('');
                                    $(self.options.select.vele).val('');
                                } else {
                                    var temps=[],ids=[],names=[];
                                    self.find(':checked').each(function(){
                                        var i = self.find(':checkbox[name=wchoose]').index(this);
                                        temps.push(data[i]);
                                        ids.push(data[i].id);
                                        names.push(data[i].name);
                                    });
                                    $(self.options.select.tele).val(names.join(","));
                                    $(self.options.select.vele).val(ids.join(","));
                                    if (typeof self.options.select.fn == 'function') fn(temps);
                                }
                            }
                            self.close();
                        });
                        self.show();
                    },
                      dataType:'json'
                });
            } else {
                if (self.options.contentType == "selector") {
                    self.selector = self._content;
                    self._content = $(self.selector).html();
                    self.setContent(self._content);
                    //if have checkbox do
                    var cs = $(self.selector).find(':checkbox');
                    self.dc.find(':checkbox').each(function(i){
                        this.checked = cs[i].checked;
                    });
                    $(self.selector).empty();
                    self.show();
                    self.focus();
                    self.onopen();
                } else if (self.options.contentType == "ajax") {
                    self.ajaxurl = self._content;
                    self.setLoading();
                    self.show();
                    self.dh.find(".dialog-button").hide();
                    if (self.options.cache == false) {
                        if (self.ajaxurl.indexOf('?') == -1) {
                            self.ajaxurl += "?_t=" + Math.random();
                        } else {
                            self.ajaxurl += "&_t=" + Math.random();
                        }
                    }
                    $.get(self.ajaxurl, self.options.postParams, function(data) {
                        self._content = data;
                        self.setContent(self._content);
                        self.show();
                        self.focus();
                        self.onopen();
                    });
                } else if (self.options.contentType == "iframe") { /*加入iframe使程序可以直接引用其它页面 by ePim*/
                    var html = '<style type="text/css">';
                    html += ('\n.dialog-box .dialog-content{padding:0px;}');
                    html += ('\n</style>');
                    html += ('<iframe class="dialogIframe" src="'+self._content+'" width="100%" height="100%" frameborder="0"></iframe>');
                    self.setContent(html);
                    self.onopen();
                    self.show();
                } else {
                    self.setContent(self._content);
                    self.show();
                    self.focus();
                    self.onopen();
                }
            }
        }
        //初始化弹窗事件
        this.initEvent = function() {
            self.dh.find(".dialog-close, .dialog-cancel, .dialog-ok").unbind('click').click(function(){self.close()});
            if (typeof(self.options.onok) == "function") {
                self.dh.find(".dialog-ok").unbind('click').click(function(){self.options.onok(self)});
            }
            if (typeof(self.options.oncancel) == "function") {
                self.dh.find(".dialog-cancel").unbind('click').click(function(){self.options.oncancel(self)});
            }
            if (self.options.timeout > 0) {
                window.setTimeout(self.close, (self.options.timeout * 1000));
            }
            this.drag();
        }
        //设置onok事件
        this.setOnok = function(fn) {
            self.dh.find(".dialog-ok").unbind('click');
            if (typeof(fn)=="function") {
                self.dh.find(".dialog-ok").click(function(){fn(self)});
            }
        }
        //设置onOncancel事件
        this.setOncancel = function(fn) {
            self.dh.find(".dialog-cancel").unbind('click');
            if (typeof(fn)=="function") {
                self.dh.find(".dialog-cancel").click(function(){fn(self)});
            }
        }
        //设置onOnclose事件
        this.setOnclose = function(fn) {
            self.options.onclose = fn;
        }
        //弹窗拖拽
        this.drag = function() {
            if (self.options.draggable && self.options.showTitle) {
                self.dh.find('.dialog-header').mousedown(function(event){
                    var h  = this;
                    var o  = document;
                    var ox = self.dh.position().left;
                    var oy = self.dh.position().top;
                    var mx = event.clientX;
                    var my = event.clientY;
                    var width = self.dh.width();
                    var height = self.dh.height();
                    var bwidth = self.bwidth();
                    var bheight = self.bheight();
                    if (h.setCapture) {
                        h.setCapture();
                    }
                    $(document).mousemove(function(event){
                        if (window.getSelection) {
                            window.getSelection().removeAllRanges();
                        } else {
                            document.selection.empty();
                        }
                        //TODO
                        var left = Math.max(ox+event.clientX-mx, 0);
                        var top = Math.max(oy+event.clientY-my, 0);
                        var left = Math.min(left, bwidth-width);
                        var top = Math.min(top, bheight-height);
                        self.dh.css({left: left, top: top});
                    }).mouseup(function(){
                        if (h.releaseCapture) {
                            h.releaseCapture();
                        }
                        $(document).unbind('mousemove');
                        $(document).unbind('mouseup');
                    });
                });
            }
        }
        //打开前的回弹函数
        this.onopen = function() {
            if (typeof(self.options.onopen) == "function") {
                self.options.onopen(self);
            }
        }
        //增加一个按钮
        this.addButton = function(opt) {
            opt = opt || {};
            opt.title = opt.title || 'OK';
            opt.bclass = opt.bclass || 'dialog-btn1';
            opt.fn = opt.fn || null;
            opt.index = opt.index || 0;
            var btn = $('<input type="button" class="'+opt.bclass+'" value="'+opt.title+'">').click(function(){
                if (typeof opt.fn == "function") opt.fn(self);
            });
            if (opt.index < self.db.find('input').length) {
                self.db.find('input:eq('+opt.index+')').before(btn);
            } else {
                self.db.append(opt);
            }
        }
        //显示弹窗
        this.show = function() {
            if (self.options.showButton) {
                self.dh.find('.dialog-button').show();
            }
            if (self.options.position == 'center') {
                self.setCenterPosition();
            } else {
                self.setElementPosition();
            }
            if (typeof self.options.showAnimate == "string") {
                self.dh.show(self.options.animate);
            } else {
                self.dh.animate(self.options.showAnimate.animate, self.options.showAnimate.speed);
            }
            if (self.mh) {
                self.mh.show();
            }
        }
        this.hide = function(fn) {
            if (typeof self.options.hideAnimate == "string") {
                self.dh.hide(self.options.animate, fn);
            } else {
                self.dh.animate(self.options.hideAnimate.animate, self.options.hideAnimate.speed, "", fn);
            }
        }
        //设置弹窗焦点
        this.focus = function() {
            if (self.options.focus) {
                self.dh.find(self.options.focus).focus();//TODO IE中要两次
                self.dh.find(self.options.focus).focus();
            } else {
                self.dh.find('.dialog-cancel').focus();
            }
        }
        //在弹窗内查找元素
        this.find = function(selector) {
            return self.dh.find(selector);
        }
        //设置加载加状态
        this.setLoading = function() {
            self.setContent('<div class="tan-295-top clearfix"><dl><dt class="tan-dt-load"></dt><dd class="tan-dd-load"><p>请稍候，正在加载中...</p></dd></dl></div>');
            self.dh.find(".dialog-button").hide();
            if (self.dc.height() < 100) {
                self.dc.height(Math.max(100, self.options.height));
            }
            if (self.dh.width() < 200) {
                self.dh.width(Math.max(200, self.options.width));
            }
        }
        this.setWidth = function(width) {
            self.dh.width(width);
        }
        //设置标题
        this.setTitle = function(title) {
            self.dt.html(title);
        }
        //取得标题
        this.getTitle = function() {
            return self.dt.html();
        }
        //设置内容
        this.setContent = function(content) {
            self.dc.html(content);
            if (self.options.height>0) {
                self.dc.css('height', self.options.height);
            } else {
                self.dc.css('height','');
            }
            if (self.options.width>0) {
                self.dh.css('width', self.options.width);
            } else {
                self.dh.css('width','');
            }
            if (self.options.showButton) {
                self.dh.find(".dialog-button").show();
            }
        }
        //取得内容
        this.getContent = function() {
            return self.dc.html();
        }
        //使能按钮
        this.disabledButton = function(btname, state) {
            self.dh.find('.dialog-'+btname).attr("disabled", state);
        }
        //隐藏按钮
        this.hideButton = function(btname) {
            self.dh.find('.dialog-'+btname).hide();
        }
        //显示按钮
        this.showButton = function(btname) {
            self.dh.find('.dialog-'+btname).show();
        }
        //设置按钮标题
        this.setButtonTitle = function(btname, title) {
            self.dh.find('.dialog-'+btname).val(title);
        }
        //操作完成
        this.next = function(opt) {
            opt = opt || {};
            opt.title = opt.title || self.getTitle();
            opt.content = opt.content || "";
            opt.okname = opt.okname || "确定";
            opt.width = opt.width || 260;
            opt.onok = opt.onok || self.close;
            opt.onclose = opt.onclose || null;
            opt.oncancel = opt.oncancel || null;
            opt.hideCancel = opt.hideCancel || true;
            self.setTitle(opt.title);
            self.setButtonTitle("ok", okname);
            self.setWidth(width);
            self.setOnok(opt.onok);
            if (opt.content != "") self.setContent(opt.content);
            if (opt.hideCancel)    self.hideButton("cancel");
            if (typeof(opt.onclose) == "function") self.setOnclose(opt.onclose);
            if (typeof(opt.oncancel) == "function") self.setOncancel(opt.oncancel);
            self.show();
        }
        //关闭弹窗
        this.close = function(n) {
            if (typeof(self.options.onclose) == "function") {
                self.options.onclose(self);
            }
            if (self.options.contentType == 'selector') {
                if (self.options.contentChange) {
                    //if have checkbox do
                    var cs = self.find(':checkbox');
                    $(self.selector).html(self.getContent());
                    if (cs.length > 0) {
                        $(self.selector).find(':checkbox').each(function(i){
                            this.checked = cs[i].checked;
                        });
                    }
                } else {
                    $(self.selector).html(self._content);
                }
            } else if (self.options.contentType == "iframe") {
                var iframe = self.dh.find(".dialogIframe");
                iframe.removeAttr("src");
            }
            //设置关闭后的焦点
            if (self.options.blur) {
                $(self.options.blur).focus();
            }
            //从数组中删除
            for (i = 0; i < arrweebox.length; i++) {
                if (arrweebox[i].dh.get(0) == self.dh.get(0)) {
                    arrweebox.splice(i, 1);
                    break;
                }
            }
            self.hide();
            self.dh.remove();
            if (self.mh) {
                self.mh.remove();
            }
        }
        //取得遮照高度
        this.bheight = function() {
            if ($.browser.msie && $.browser.version < 7) {
                var scrollHeight = Math.max(
                    document.documentElement.scrollHeight,
                    document.body.scrollHeight
                );
                var offsetHeight = Math.max(
                    document.documentElement.offsetHeight,
                    document.body.offsetHeight
                );

                if (scrollHeight < offsetHeight) {
                    return $(window).height();
                } else {
                    return scrollHeight;
                }
            } else {
                return $(document).height();
            }
        }
        //取得遮照宽度
        this.bwidth = function() {
            if ($.browser.msie && $.browser.version < 7) {
                var scrollWidth = Math.max(
                    document.documentElement.scrollWidth,
                    document.body.scrollWidth
                );
                var offsetWidth = Math.max(
                    document.documentElement.offsetWidth,
                    document.body.offsetWidth
                );

                if (scrollWidth < offsetWidth) {
                    return $(window).width();
                } else {
                    return scrollWidth;
                }
            } else {
                return $(document).width();
            }
        }
        //将弹窗显示在中间位置
        this.setCenterPosition = function() {
            var wnd = $(window), doc = $(document),
                pTop = doc.scrollTop(),    pLeft = doc.scrollLeft();
            pTop += (wnd.height() - self.dh.height()) / 2;
            pLeft += (wnd.width() - self.dh.width()) / 2;
            self.dh.css({top: pTop, left: pLeft});
        }
        //根据元素设置弹窗显示位置
        this.setElementPosition = function() {
            var trigger = $(self.options.position.refele);
            var reftop = self.options.position.reftop || 0;
            var refleft = self.options.position.refleft || 0;
            var adjust = (typeof self.options.position.adjust=="undefined")?true:self.options.position.adjust;
            var top = trigger.offset().top + trigger.height();
            var left = trigger.offset().left;
            var docWidth = document.documentElement.clientWidth || document.body.clientWidth;
            var docHeight = document.documentElement.clientHeight|| document.body.clientHeight;
            var docTop = document.documentElement.scrollTop|| document.body.scrollTop;
            var docLeft = document.documentElement.scrollLeft|| document.body.scrollLeft;
            var docBottom = docTop + docHeight;
            var docRight = docLeft + docWidth;
            if (adjust && left + self.dh.width() > docRight) {
                left = docRight - self.dh.width() - 1;
            }
            if (adjust && top + self.dh.height() > docBottom) {
                top = docBottom - self.dh.height() - 1;
            }
            left = Math.max(left+refleft, 0);
            top = Math.max(top+reftop, 0);
            self.dh.css({top: top, left: left});
        }
        this.initOptions();
        this.initMask();
        this.initBox();
        this.initContent();
        this.initEvent();
    }

    var weeboxs = function() {
        var self = this;
        this._onbox = false;
        this._opening = false;
        this.zIndex = 9999;
        this.length = function() {
            return arrweebox.length;
        }
        this.open = function(content, options) {
            self._opening = true;
            if (typeof(options) == "undefined") {
                options = {};
            }
            if (options.boxid) {
                for (var i = 0; i < arrweebox.length; i++) {
                    if (arrweebox[i].dh.attr('id') == options.boxid) {
                        arrweebox[i].close();
                        break;
                    }
                }
            }
            options.zIndex = self.zIndex;
            self.zIndex += 10;
            var box = new weebox(content, options);
            box.dh.click(function(){self._onbox = true;});
            arrweebox.push(box);
            /*-----解决在ie下页面过大时出现部分阴影没有覆盖的问题-----by ePim*/
            if (box.options.position != "center"){
                box.setElementPosition();
            }
            if (box.mh) {
                box.mh.css({
                    width: box.bwidth(),
                    height: box.bheight()
                });
            }
            /*-----解决在ie下页面过大时出现部分没有遮罩的问题-----by ePim(WanJiDong@gmail.com)*/
            return box;
        }
        //关闭最上层窗体,程序调用方法：jQuery.weeboxs.close();
        this.close = function(){
            var closingBox = this.getTopBox();
            if (false != closingBox) {
                closingBox.close();
            }
        }
        this.getTopBox = function() {
            if (arrweebox.length > 0) {
                return arrweebox[arrweebox.length-1];
            } else {
                return false;
            }
        }
        $(window).scroll(function() {
            if (arrweebox.length > 0) {
                for (i = 0;i<arrweebox.length;i++) {
                    var box = arrweebox[i];//self.getTopBox();
                    /*if (box.options.position == "center") {
                        box.setCenterPosition();
                    }*/
                    if (box.options.position != "center"){
                        box.setElementPosition();
                    }
                    if (box.mh) {
                        box.mh.css({
                            width: box.bwidth(),
                            height: box.bheight()
                        });
                    }
                }
            }
        }).resize(function() {
            if (arrweebox.length > 0) {
                var box = self.getTopBox();
                if (box.options.position == "center") {
                    box.setCenterPosition();
                }
                if (box.mh) {
                    box.mh.css({
                        width: box.bwidth(),
                        height: box.bheight()
                    });
                }
            }
        });
        $(document).click(function(event) {
            if (event.button == 2) return true;
            if (arrweebox.length > 0) {
                var box = self.getTopBox();
                if (!self._opening && !self._onbox && box.options.clickClose) {
                    box.close();
                }
            }
            self._opening = false;
            self._onbox = false;
        });
    }
    $.extend({weeboxs: new weeboxs()});
})(jQuery);